23 #define foreach(x, v) for (typeof (v).begin() x=(v).begin(); x !=(v).end(); ++x)
24 #define For(i, a, b) for (int i=(a); i<(b); ++i)
25 #define D(x) cout << #x " is " << x << endl
27 const long long CO
= 198159127;
29 const int MAXN
= 1000010;
31 long long ha
[MAXN
], hb
[MAXN
], pw
[MAXN
];
36 while (getline(cin
, a
) && getline(cin
, b
)) {
37 if (a
.size() != b
.size()) {
48 for (int i
= 1; i
<= n
; ++i
) {
49 ha
[i
] = ha
[i
-1] * CO
+ (long long)a
[i
];
50 //printf("ha[%d] = %lld\n", i, ha[i]);
51 hb
[i
] = hb
[i
-1] * CO
+ (long long)b
[i
];
52 //printf("hb[%d] = %lld\n", i, hb[i]);
56 string
c(1 + 2*n
+ 1, ' ');
57 for (int i
= 1; i
<= n
; ++i
) {
58 c
.at(i
) = a
.at(n
-i
+1);
61 for (int i
= n
+ 2; i
<= n
+ n
+ 1; ++i
) {
62 c
.at(i
) = b
.at(i
-n
-1);
68 for (int i
= 2; i
<= n
+ n
+ 1; ++i
) {
69 while ( (k
> 0) and (c
[i
] != c
[k
+1]) ) k
= pr
[k
];
70 if (c
[i
] == c
[k
+ 1]) k
++;
75 printf("pr[i=%d] = %d\n", i
, pr
[i
]);
79 for (int i
= 1; i
<= n
- 1; ++i
) {
80 if (a
[i
] != b
[n
-i
+1]) break;
84 //printf("i is %d: lhs = %lld, rhs = %lld\n", i, ha[i+len] - ha[i] * pw[len], hb[len] );
85 if ((ha
[i
+len
] - ha
[i
] * pw
[len
]) != hb
[len
]) continue;
86 ri
= i
-1, rj
= i
+ len
;
88 printf("%d %d\n", ri
, rj
);